<?php

namespace App\Component;

use Nette\Application\UI\Control,
	Nette\Application\UI\Form;

class UserBox extends Control {

  /**
   * Login form component
   * @return \Nette\Application\UI\Form
   */
	public function createComponentLoginForm() {
		$form = new Form();
		$form->addText('nickname', 'Jméno:');
		$form->addPassword('password', 'Heslo:');
		$form->addSubmit('loginSubmit', 'Přihlásit' );
		$form->onSuccess[] = callback($this, 'submitLoginForm');

		return $form;
	}

  /**
   * Submit login form
   * @param \Nette\Application\UI\Form $form
   */
	public function submitLoginForm(Form $form) {
			$values = $form->getValues();
			$user = $this->presenter->getUser();

      try {
				$user->login($values['nickname'], $values['password']);
				$user->setExpiration('+ 30 minutes', TRUE);
			} catch (\Exception $e) {
        $this->presenter->flashMessage($e->getMessage(), 'danger');
        $this->presenter->redirect('this');
			}
      
      $this->presenter->flashMessage('Vítejte a užijte si naše kytarové lekce', 'success');
      $this->presenter->redirect('this');
      
	}
  
  /**
   * Component register form
   * @return \Nette\Application\UI\Form
   */
  public function createComponentRegisterForm(){
    $registerForm = new Form();
    
    $registerForm->addText('login', 'Přihlašovací jméno:')
        ->addRule(Form::FILLED, 'Přihlašovací jméno musí být vyplněno')
        ->addRule(Form::MAX_LENGTH, 'Přihlašovací jméno může být maximálně 20 znaků dlouhé', 20)
        ->addRule(Form::MIN_LENGTH, 'Přihlašovací jméno musí být minimálně 3 znaky dlouhé', 3);
    
    $registerForm->addPassword('password', 'Heslo:')
        ->addRule(Form::FILLED, 'Heslo musí být vyplněno')
        ->addRule(Form::MAX_LENGTH, 'Heslo může být maximálně 20 znaků dlouhé', 20)
        ->addRule(Form::MIN_LENGTH, 'Heslo musí být minimálně 3 znaky dlouhé', 3);
    
    $registerForm->addPassword('password_again', 'Heslo znovu:')
        ->addRule(Form::EQUAL, 'Hesla musí být totožná', $registerForm['password']);
    
    $registerForm->addText('email', 'Email:')
        ->addRule(Form::FILLED, 'Email musí být vyplněn')
        ->addRule(Form::EMAIL, 'Email musí být validní');
    
    $registerForm->addCheckbox('rules', '')
        ->addRule(Form::EQUAL, 'Musíte souhlasit s našimi podmínkami', TRUE);
    $registerForm->addSubmit ('send', 'Registrovat');
    $registerForm->onSubmit[] = callback($this, 'registerFormSubmit');
    
    return $registerForm;
  }

  /**
   * Submit register form
   * @param \Nette\Application\UI\Form $form
   */
	public function registerFormSubmit(Form $form){

    $values = $form->getValues();
    $um = $this->presenter->context->getService('userManager');
    
    if(!$um->isLoginFree($values['login'])){
      $form->addError('Toto přihlašovací jméno je již použito, zvolte jiné');
    }
    
    if(!$um->isEmailFree($values['email'])){
      $form->addError('Toto email je již používán, zvolte jiný');
    }
    
    if($form->hasErrors()){
      $err = $form->getErrors();
      echo json_encode(array('status' => 'error', 'data' => $err[0]));
      exit();
    }
    
    $um->registerNewUser($values['login'], $values['password'], $values['email'], $this->presenter);
    
    echo json_encode(array('status' => 'ok', 'data' => 'Na Vaši emailovoou adresu jsme zaslali zprávu, ve které registraci potvrdíte'));
    exit();
  }

  /**
   * Logout user
   */
	public function handleLogout() {
			$user = $this->presenter->getUser();
			$user->logout(true);
      $this->presenter->flashMessage('Těšíme se na další návštěvu', 'success');
      $this->presenter->redirect('this');
	}

  /**
   * Render component
   */
	public function render() {
		$template = $this->template;
		$template->setFile(__DIR__ . '/userbox.latte');
		$user = $this->presenter->getUser();
		$template->user = $user;
		$template->render();
	}

}
